// created by gpake
(function () {
  let config = {
    qiniuRegion: "",
    qiniuImageURLPrefix: "",
    qiniuUploadToken: "",
    qiniuUploadTokenURL: "",
    qiniuUploadTokenFunction: null
  };
  module.exports = {
    init,
    upload,
  };
  // 在整个程序生命周期中，只需要 init 一次即可
  // 如果需要变更参数，再调用 init 即可
  function init(options) {
    config = {
      qiniuRegion: "",
      qiniuImageURLPrefix: "",
      qiniuUploadToken: "",
      qiniuUploadTokenURL: "",
      qiniuUploadTokenFunction: null
    };
    updateConfigWithOptions(options);
  }

  function updateConfigWithOptions(options) {
    if (options.region) {
      config.qiniuRegion = options.region;
    } else {
      console.error("qiniu uploader need your bucket region");
    }
    if (options.uptoken) {
      config.qiniuUploadToken = options.uptoken;
    } else if (options.uptokenURL) {
      config.qiniuUploadTokenURL = options.uptokenURL;
    } else if (options.uptokenFunc) {
      config.qiniuUploadTokenFunction = options.uptokenFunc;
    }
    if (options.domain) {
      config.qiniuImageURLPrefix = options.domain;
    }
  }

  function upload(filePath, success, fail, options) {
    if (null == filePath) {
      console.error("qiniu uploader need filePath to upload");
      return;
    }
    if (options) {
      init(options);
    }
    if (config.qiniuUploadToken) {
      doUpload(filePath, success, fail, options);
    } else if (config.qiniuUploadTokenURL) {
      getQiniuToken(function () {
        doUpload(filePath, success, fail, options);
      });
    } else if (config.qiniuUploadTokenFunction) {
      config.qiniuUploadToken = config.qiniuUploadTokenFunction();
    } else {
      console.error("qiniu uploader need one of [uptoken, uptokenURL, uptokenFunc]");
      return;
    }
  }

  function doUpload(filePath, success, fail, options) {
    let url = uploadURLFromRegionCode(config.qiniuRegion);
    let fileName = filePath.split("//")[1];
    if (options && options.key) {
      fileName = options.key;
    }
    let formData = {
      "token": config.qiniuUploadToken,
      "key": fileName
    };
    uni.uploadFile({
      url,
      filePath,
      name: "file",
      formData,
      success (res) {
        let dataString = res.data;
        let dataObject = JSON.parse(dataString);
        // do something
        let imageUrl = config.qiniuImageURLPrefix + dataObject.key;
        dataObject.imageURL = imageUrl;
        // console.log(dataObject);
        if (success) {
          success(dataObject);
        }
      },
      fail (error) {
        console.log(error);
        if (fail) {
          fail(error);
        }
      }
    });
  }

  function getQiniuToken(callback) {
    uni.request({
      url: config.qiniuUploadTokenURL,
      success (res) {
        let token = res.data.uptoken;
        config.qiniuUploadToken = token;
        if (callback) {
          callback();
        }
      },
      fail (error) {
        console.log(error);
      }
    });
  }

  function uploadURLFromRegionCode(code) {
    let uploadURL = null;
    switch (code) {
      case "ECN": uploadURL = "https://up.qbox.me"; break;
      case "NCN": uploadURL = "https://up-z1.qbox.me"; break;
      case "SCN": uploadURL = "https://up-z2.qbox.me"; break;
      case "NA": uploadURL = "https://up-na0.qbox.me"; break;
      default: console.error("please make the region is with one of [ECN, SCN, NCN, NA]");
    }
    return uploadURL;
  }

})();
